import { createRouter, createWebHashHistory } from "vue-router";
import Login from "@/common/auth/Login.vue";
import Layout from "@/layout/Index.vue";
import MainView from "@/layout/components/MainView.vue";
import store from "@/store"
import { authRouters } from './module/auth'
/**
 * RouteItem 解释
    {
        path: "/",  // 路由地址 必填
        name: "index", // 路由名称 必填
        component: Index, // 组件 必填
        meta: {
            isMenu:false, // 是否显示在侧边栏显示此项
            path:'www.baidu.com', // 外链
            title: 'components', // 将在侧边栏显示的菜单名称
            icon: 'component', // 将在侧边栏显示的菜单图标
            permissions: ['xxx'], // 什么权限可以访问此界面
            cache:false, // 是否缓存界面，再次进入是将不刷新
            activeMenu:'/index', // 用于应对 path:'/index/1' 时菜单不亮
        },
        children:[] // 子级菜单，isMenu不影响子级，也就是说如果想让子级也在侧边栏隐藏也需要设置isMenu:false
    },
 */

/**
 * 通用组件解释
 * Layout 此为带侧边栏，顶部工具栏和内容页的通用组件 通常用在第一集路由上
 * MainView 内容页组件 通常用在嵌套路由中
 */

// 基础路由或无需动态加载的路由应在此处进行进行注册
const constantRoutes = [{
    path: "/",
    name: "test3",
    component: Layout,
}, {
    path: "/login",
    name: "login",
    component: Login,
}
]

// 动态路由注册方法
export const dynamicRoutes = [
    authRouters,
];

let copyConstantRoutes = []
Object.assign(copyConstantRoutes, constantRoutes)
export const router = createRouter({
    history: createWebHashHistory(),
    scrollBehavior: () => ({
        y: 0
    }),
    routes: copyConstantRoutes
})

export function resetRouter() {
    const newRouter = createRouter()
    router.matcher = newRouter.matcher
}

router.beforeEach((to, from) => {
    let waiteList = ['/login']
    if (store.state.user.token === null) {
        if (waiteList.indexOf(to.fullPath) >= 0) {
            return true
        } else {
            return '/login'
        }
    } else {
        if (router.options.routes.length <= constantRoutes.length && store.state.user.sidebarList.length > 0) {
            store.commit('user/loadRoute')
            return to.path
        }
        return true
    }
})